home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <stdlib.h>
- #include "pc_inc.h"
-
-
- /*
- BIT_write_*** : データの下位ビットをファイルの上位ビットに書き込む
- BIT_read_*** : ファイルの上位ビットからデータの下位ビットに読み込む
- */
-
- BIT_FILE *BIT_open( char *pname, char *type )
- {
- BIT_FILE *ret;
-
- if ( ( ret = (BIT_FILE *)malloc( sizeof(BIT_FILE) ) ) == NULL )
- return ( NULL );
- if ( ( ret->fp = fopen( pname, type ) ) == NULL )
- {
- free( ret );
- return ( NULL );
- }
- ret->mask = 128; /* write関数用 */
- ret->bcnt = 8; /* read関数用 */
- ret->buf = 0;
-
- return ( ret );
- }
-
- int BIT_close( BIT_FILE *bfp )
- {
- if ( bfp->mask < 128 )
- if ( fputc( bfp->buf, bfp->fp ) == EOF )
- return (-1);
- fclose( bfp->fp );
- free( bfp );
- }
-
- int BIT_read_bit( unsigned int *dest, BIT_FILE *bfp )
- {
- /* buf が空だったら読み込み */
- if ( bfp->bcnt == 8 )
- if ( ( bfp->buf = fgetc( bfp->fp ) ) == EOF )
- return (0);
- else
- bfp->bcnt = 0;
- /* 1 bit 読み込む */
- if ( bfp->buf & 0x80 )
- *dest = 1;
- else *dest = 0;
- bfp->buf <<= 1;
- bfp->bcnt++;
-
- return (1);
- }
-
- int BIT_read_bits( unsigned int *dest, size_t nelen, BIT_FILE *bfp )
- {
- size_t cnt;
-
- *dest = 0;
- for( cnt=0; cnt<nelen; cnt++ )
- {
- /* buf が空だったら読み込み */
- if ( bfp->bcnt == 8 )
- if ( ( bfp->buf = fgetc( bfp->fp ) ) == EOF )
- return ( cnt );
- else bfp->bcnt = 0;
- /* 1 bit 読み込む */
- *dest <<= 1;
- if ( bfp->buf & 0x80 )
- (*dest)++;
- bfp->buf <<= 1;
- bfp->bcnt++;
- }
-
- return ( cnt );
- }
-
- int BIT_read_bytes( void *dest, size_t s, size_t n, BIT_FILE *bfp )
- {
- bfp->bcnt = 8;
- return ( fread( dest, s, n, bfp->fp ) );
- }
-
- int BIT_write_bit( unsigned int src, BIT_FILE *bfp )
- {
- /* 1 bit 書き込む */
- if ( src )
- bfp->buf |= bfp->mask;
- bfp->mask >>= 1;
- /* buf が一杯だったら書き込み */
- if ( bfp->mask == 0 )
- if ( fputc( bfp->buf, bfp->fp ) == EOF )
- return (0);
- else
- {
- bfp->mask = 128;
- bfp->buf = 0;
- }
-
- return (1);
- }
-
- int BIT_write_bits( unsigned int src, size_t nelen, BIT_FILE *bfp )
- {
- size_t cnt;
-
- src <<= (32-nelen);
- for( cnt=0; cnt<nelen; cnt++ )
- {
- /* 1 bit 書き込む */
- if ( src & 0x80000000 )
- bfp->buf |= bfp->mask;
- bfp->mask >>= 1;
- src <<= 1;
-
- /* buf が一杯だったら書き込み */
- if ( bfp->mask == 0 )
- if ( fputc( bfp->buf, bfp->fp ) == EOF )
- break;
- else
- {
- bfp->mask = 128;
- bfp->buf = 0;
- }
- }
-
- return ( cnt );
- }
-
- int BIT_write_bytes( void *src, size_t s, size_t n, BIT_FILE *bfp )
- {
- if ( bfp->mask < 128 )
- {
- if ( fputc( bfp->buf, bfp->fp ) == EOF )
- return (0);
- bfp->mask = 128;
- bfp->buf = 0;
- }
- return ( fwrite( src, s, n, bfp->fp ) );
- }
-